home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / ISSUE05 / CALLBAX / CHANGE2U.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-12-06  |  2.1 KB  |  78 lines

  1. unit Change2u;
  2.  
  3. interface
  4.  
  5. uses
  6.   ThunkU, SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  7.   Forms, Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables;
  8.  
  9. const
  10.   wm_TableChanged = wm_User + 57;
  11.  
  12. type
  13.   TForm1 = class(TForm)
  14.     Table1: TTable;
  15.     DataSource1: TDataSource;
  16.     DBGrid1: TDBGrid;
  17.     procedure FormDestroy(Sender: TObject);
  18.     procedure FormCreate(Sender: TObject);
  19.   private
  20.     { Private declarations }
  21.     FOldCallBack: TCallBack;
  22.     FChangeFunctionThunk: TFarProc;
  23.   public
  24.     { Public declarations }
  25.     procedure WMTableChanged(var Msg: TMessage); message wm_TableChanged;
  26.   end;
  27.  
  28. var
  29.   Form1: TForm1;
  30.  
  31. implementation
  32.  
  33. uses
  34.   DbiTypes, DbiProcs;
  35.  
  36. {$R *.DFM}
  37. {$S-}
  38.  
  39. function ChangeFunction(ecbType: CBType; iClientData: Longint;
  40.   var CbInfo: Pointer): CBRType; export;
  41. begin
  42.   Result := cbrUseDef;
  43.   { Refresh table, but not while this callback is executing - in a }
  44.   { message handler that runs after this has done }
  45.   if ecbType = cbTableChanged then
  46.     PostMessage(Application.MainForm.Handle, wm_TableChanged, 0, iClientData);
  47.   { Chain on to old callback, if any }
  48.   with Form1.FOldCallBack do
  49.     if ChainedFunc <> nil then Result :=
  50.       pfDBICallBack(ChainedFunc)(cbTableChanged, Data, Buffer)
  51. end;
  52.  
  53. procedure TForm1.FormCreate(Sender: TObject);
  54. begin
  55.   FChangeFunctionThunk := NewMakeProcInstance(@ChangeFunction, HInstance);
  56.   { Find any current callback }
  57.   with FOldCallBack do
  58.     DbiGetCallBack(nil, cbTableChanged, Data, BufLen, Buffer, @ChainedFunc);
  59.   { Register our callback }
  60.   DbiRegisterCallBack(Table1.Handle, cbTableChanged, Longint(Table1), 0, nil,
  61.     pfDbiCallBack(FChangeFunctionThunk));
  62. end;
  63.  
  64. procedure TForm1.FormDestroy(Sender: TObject);
  65. begin
  66.   DbiRegisterCallBack(Table1.Handle, cbTableChanged, 0, 0, nil, nil);
  67.   NewFreeProcInstance(FChangeFunctionThunk);
  68. end;
  69.  
  70. procedure TForm1.WMTableChanged(var Msg: TMessage);
  71. begin
  72.   if MessageDlg(TTable(Msg.LParam).TableName + ' has changed - refresh?',
  73.      mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  74.     TTable(Msg.LParam).Refresh;
  75. end;
  76.  
  77. end.
  78.